Aufrufhierarchie ermitteln

Beim Programmdebugging ist es manchmal sinnvoll, zu dokumentieren, welche Routine oder Methode von welchem Aufrufer gerufen wurde (SAPMV45A und die Userexits…). Die folgende Routine leistet das.

Wird bei dem CALL-Befehl unter DEPTH die Zahl -1 angegeben, so wird die Tabelle TAB mit der gesamten Aufrufhierarchie gefüllt.

Die folgende Routine können Sie in ein eigenes Programm setzen und dann aus jedem beliebigen anderen Programm heraus aufrufen.

Die Routine

FORM aktuelle_routine.

  TYPES: 
    begin of abap_call_stack_entry,
      mainprogram  like sy-repid,
      include      like sy-repid,
      line         type i,
      eventtype    like abdbg-leventtype,
      event        like abdbg-levent,
      flag_system  type c,
    end of abap_call_stack_entry.
 
  DATA: 
    acse type abap_call_stack_entry,
    tab  type table of abap_call_stack_entry.

  CALL 'ABAP_CALLSTACK' ID 'DEPTH'     FIELD 2
                        ID 'CALLSTACK' FIELD tab.

    LOOP AT tab INTO acse FROM 2.
*-- Der Start ab dem zweiten Eintrag ist notwendig, weil in
*-- der ersten Tabellenzeile der aktuelle Eintrag steht, also
*-- diese FORM-Routine. 
      WRITE: 
      / 'Mainprog:', acse-mainprogram,
      / 'Include: ', acse-include,
      / 'Event:   ', acse-eventtype,
                     acse-event.

    ENDLOOP.

ENDFORM.

Funktionsbaustein

Hilfreich ist auch der Funktionsbaustein SYSTEM_CALLSTACK, der ebenfalls Informationen über die Aufrufhierarchie liefert!

Klasse

Die Klasse CL_ABAP_GET_CALL_STACK liefert mit Hilfe der Methode GET_CALL_STACK ebenfalls die aktuelle Aufrufhierarchie.

Wahrscheinlich ist die aufbereitete Form des Aufrufstapels in der Regel nützlicher:

DATA(stack) = cl_abap_get_call_stack=>format_call_stack_with_struct( cl_abap_get_call_stack=>get_call_stack( ) ).
Ausgabe der Aufrufhierarchie aus der Testumgebung des Class Builders mit CL_DEMO_OUTPUT.
Enno Wulff

Leave a Comment